注意:所有文章除特别说明外,转载请注明出处.
[TOC]
第三章 Java内存模型
3.1 Java内存模型基础
Java线程之间的通信由Java内存模型(JMM)控制,JMM决定一个线程对共享变量的写入何时对另一个线程可见。
3.1.3 重排序
1. 编译器优化的重排序:编译器在不改变单线程语义的情况下,可以重新安排语句的执行顺序。
2. 指令集并行的重排序:现代处理器采用指令并行技术来将多条指令重叠执行。如果不错在数据依赖性,处理器可以改变语句对应机器指令的执行顺序。
3. 内存系统的重排序:处理器使用缓存读/写缓冲区,从而使得加载和存储操作看上去可能在乱序执行。
3.1.5 happens-before
注意:两个操作之间具有happens-before关系并不意味着前一个操作必须要在后一个操作之前执行。happens-before仅仅要求前一个操作对后一个操作可见,且前一个操作按顺序排在后一个操作之前。
3.4 volitale的内存语义
3.4.1 volatile的特性
我们理解volitle特性是将volatile变量的单个读/写看成是使用同一个锁对象对这些单个读/写操作做同步。
提示:一个volatile变量的单个读/写操作,与一个普通变量的读/写操作都是使用同一个锁来同步,它们之间执行效果一样。
提示:锁的happen-before规则保证释放锁和获取锁的两个线程之间的内存可见性,意味着对一个volatile变量的读,总是能看到对这个volatile变量最后的写入。
总结:volatile变量具有以下特性:1.可见性,对于一个volatile变量的读,总是能看到对这个volatile变量最后的写入。2.原子性,对任意单个volatile变量的读/写具有原子性。
3.4.2 volatile写-读建立的happen-before关系
从内存语义的角度来看,volatile的读-写与锁的释放-获取有相同的内存效果。